/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.pecinovsky.english.pojj.adv_framework.utilities;

import java.io.IOException;
import java.io.OutputStream;



/*******************************************************************************
 * Instance třídy {@code MultiOutput} představuje proud združující sadu
 * proudů, které se navenek tváří jako jeden proud.
 * Každá operace se vždy provede s každým se sdružených proudů.
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   0.00.000
 */
public class MultiOutput extends OutputStream
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Vystupní proudy, do nichž se bude paralelně zapisovat. */
    private final OutputStream[] thisStreams;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří nový proud zastupující skupinu zadaných sdružovaných proudů.
     *
     * @param streams Sdružované proudy
     */
    public MultiOutput(OutputStream... streams)
    {
        thisStreams = streams;
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Zavře všechny sdružované proudy.
     *
     * @throws IOException
     */
    @Override
    public void close() throws IOException
    {
        for (OutputStream os : thisStreams) {
            os.close();
        }
    }


    /***************************************************************************
     *
     * @throws IOException
     */
    @Override
    public void flush() throws IOException
    {
        for (OutputStream os : thisStreams) {
            os.flush();
        }
    }


    /***************************************************************************
     *
     * @param b
     * @throws IOException
     */
    @Override
    public void write(byte[] b) throws IOException
    {
        for (OutputStream os : thisStreams) {
            os.write(b);
        }
    }


    /***************************************************************************
     *
     * @param b
     * @param off
     * @param len
     * @throws IOException
     */
    @Override
    public void write(byte[] b, int off, int len) throws IOException
    {
        for (OutputStream os : thisStreams) {
            os.write(b, off, len);
        }
    }


    /***************************************************************************
     * Zapíše zadaný znak do všech sdružených proudů.
     *
     * @param b   Kód zapisovaného znaku
     * @throws IOException
     */
    @Override
    public void write(int b) throws IOException
    {
        for (OutputStream os : thisStreams) {
            os.write(b);
        }
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        MultiOutput inst = new MultiOutput();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
